package 设计模式.行为型模式.责任链;

import java.util.HashMap;
import java.util.Map;

/**
 * 责任链模式Chain是⼀种⾏为设计模式， 允许你将请求沿着处理者链进⾏ 发送。
 * 收到请求后， 每个处理者均可对请求进⾏处理， 或将其传递给 链上的下个处理者。
 *
 * 模式原理
 * 责任链模式的原始定义是：通过为多个对象提供处理请求的机会，避免将请求的发送者与其接收者耦合。链接接收对象并沿着链传递请求，直到对象处理它。
 * 这个定义读起来抽象难懂，实际上它只说了一个关键点：通过构建一个处理流水线来对一次请求进行多次的处理。
 *
 * 案例分析
 * 假如你正在开发⼀个在线订购系统。 你希望对系统访问进⾏限制，** 只许认证⽤户创建订单**。
 * 此外， 拥有管理权限的⽤户也拥有所有订单 的完全访问权限。 简单规划后， 你会意识到这些检查必须依次进⾏。
 * 只要接收到包含⽤ 户凭据的请求， 应⽤程序就可尝试对进⼊系统的⽤户进⾏认证。 但如果由于⽤户凭据不正确⽽导致认证失败， 那就没有必要进⾏后续检查 了。
 *
 *在接下来的⼏个⽉⾥， 你实现了后续的⼏个检查步骤。
 * ⼀位同事认为直接将原始数据传递给订购系统存在安全隐患。 因此你新增了额外的验证步骤来清理请求中的数据。
 * 过了⼀段时间， 有⼈注意到系统⽆法抵御暴⼒密码破解⽅式的攻击。 为了防范这种情况， 你⽴刻添加了⼀个检查步骤来过滤来⾃同⼀ IP 地 址的重复错误请求。 ⼜有⼈提议你可以对包含同样数据的重复请求返回缓存中的结果， 从⽽ 提⾼系统响应速度。
 * 因此， 你新增了⼀个检查步骤， 确保只有没有满⾜条件的缓存结果时请求才能通过并被发送给系统。
 *
 * ** 检查代码本来就已经混乱不堪， ⽽每次新增功能都会使其更加臃肿**。 修改某个检查步骤有时会影响其他的检查步骤。
 * 最糟糕的是， 当你希 望复⽤这些检查步骤来保护其他系统组件时， 你只能复制部分代码， 因为这些组件只需部分⽽⾮全部的检查步骤。
 * 系统会变得让⼈⾮常费解， ⽽且其维护成本也会激增。
 * 你在艰难地和 这些代码共处⼀段时间后， 有⼀天终于决定对整个系统进⾏重构。
 *
 * 与许多其他⾏为设计模式⼀样， 责任链会将特定⾏为转换为被称作处理者的独⽴对象。 在上述示例中， 每个检查步骤都可被抽取为仅有单个⽅法的类， 并执⾏检查操作。
 * 请求及其数据则会被作为参数传递给该 ⽅法。
 *
 * 模式建议你将这些处理者连成⼀条链。 链上的每个处理者都有⼀个成员 变量来保存对于下⼀处理者的引⽤。 除了处理请求外，
 * 处理者还负责沿着链传递请求。 请求会在链上移动， 直⾄所有处理者都有机会对其 进⾏处理。
 * ** 最重要的是： 处理者可以决定不再沿着链传递请求， 这可⾼效地取消 所有后续处理步骤。**
 *
 * 在我们的订购系统示例中， 处理者会在进⾏请求处理⼯作后决定是否继 续沿着链传递请求。 如果请求中包含正确的数据，
 * 所有处理者都将执 ⾏⾃⼰的主要⾏为， ⽆论该⾏为是身份验证还是数据缓存。
 */
public class Client {
    public static void main(String[] args) {
     Handler authHandler = new AuthHandler();
     Handler cacheHandler = new CacheHandler();
     Handler metricsHandler = new MetricsHandler();
     Handler proceedHandler = new ProceedHandler();
     authHandler.setNext(metricsHandler);
     metricsHandler.setNext(cacheHandler);
     cacheHandler.setNext(proceedHandler);
     Map<String, Object> request = new HashMap<>();
     request.put("username", "admin");
     request.put("password", "admin");
     authHandler.handle(request);
    }
}
